package com.loong.android.tools;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 文件流写出工具
 */
public class FileStreamWriter {

    private FileOutputStream fos;
    private BufferedOutputStream bos;

    /**
     * 返回操作的java.io.FileOutputStream对象
     */
    public FileOutputStream getFileOutputStream() {
        return fos;
    }

    /**
     * 返回操作的java.io.BufferedOutputStream对象
     */
    public BufferedOutputStream getBufferedOutputStream() {
        return bos;
    }

    /**
     * 开始向一个文件写入数据，如果这个文件不存在，则自动创建。
     * 注意：需要先获得写入文件的权限(WRITE_EXTERNAL_STORAGE)
     * @param filePath 待写入的文件路径
     * @param cover 是否覆盖写出，若为false，则在已存在的文件后追加写出数据。默认为true。
     */
    public void startWrite(String filePath, boolean cover) {
        if (filePath == null || filePath.length() <= 0) return;
        File file = new File(filePath);
        try {
            fos = new FileOutputStream(file, !cover);
            bos = new BufferedOutputStream(fos);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 写入文件
     * @param data 写入数据
     */
    public void write(int data) {
        if(bos == null) return;
        try {
            bos.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 将字节数组写入文件中
     * @param bytes 字节数组
     */
    public void write(byte[] bytes) {
        if(bos == null) return;
        try {
            bos.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 将字节数组从指定位置写出指定长度到文件中
     * @param bytes 字节数组
     * @param fromIndex 起始位置
     * @param writeLength 写入长度
     */
    public void write(byte[] bytes, int fromIndex, int writeLength) {
        if(bos == null) return;
        try {
            bos.write(bytes, fromIndex, writeLength);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 结束文件流写出
     */
    public void endWrite() {
        try {
            if(bos != null) {
                bos.flush();
                bos.close();
            }
            if(fos != null) {
                fos.close();
            }
            fos = null;
            bos = null;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
